package chapter05

/**
 * Created with IntelliJ IDEA.
 * ClassName: Test01_Fun
 * Package: chapter05
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 *          Date: 2023-06-20
 *          Time: 14:26
 */

object Test01_Fun {
  def main(args: Array[String]): Unit = {
    //1.基本语法
    //定义了一个求和的sum函数
    //完成某一个功能语句的集合 称为函数
    //类中的函数称为方法 函数没有重载和重写的概念 Scala中函数可以嵌套
    def sun(x: Int, y: Int): Int = {
      x + y
    }

    //1.无参 无返回值 Unit

    //2.函数参数
    //可变参数的定义
    def f1(name: String*): Unit = {
      println(name)
    }
    //输出结果是一个集合类型 参数String也是一个集合类型
    f1("haha", "hehe") //WrappedArray(haha, hehe)

    //2.1如果参数列表中有多个参数 那么可变参数写道最后
    //2.2参数默认值一般也是写道最后
    def f2(age: Int, name: String = "张三"): Unit = {
      println(name)
    }

    f2(20) //没传值就是默认张三
    f2(34, "李四") //李四
    //带名参数 指定参数顺序 传值
    f2(name = "王五", age = 50)

    //函数至简单原则
    //能省则省

    //匿名函数
    //没有名字的函数 就是匿名函数
    println((x: Int) => x + 1) //chapter05.Test01_Fun$$$Lambda$5/1513712028@3cb5cdba

    //函数高阶
    //1.函数作为值进行传递 将函数 f2 作为一个值 赋值给 tpm
    val tmp = f2 _
    //完整写法是
    val tpm1:(Int,String)=>Unit = f2 _
    //(Int,String)=>Unit 是tmp1的类型 也是f2的函数类型
    //函数类型 传入两个参数 Int,String 返回值类型 Unit
    println(tmp) //chapter05.Test01_Fun$$$Lambda$6/312116338@1b0375b3
    //相当于重命名函数的感觉
    println(tmp(20, "函数作为值传递")) //() 因为f2的返回值是Unit

    //2.函数作为函数参数传递




  }
}
